#include "tf_log.h"
#include <stdio.h>
#include <syslog.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

#if defined( __cplusplus)
extern "C"{
#endif

static FILE *log_handle=NULL;
#define TF_DEFAULT_LOG_FILE "/tmp/tf_log.txt"
static char* log_file_name=NULL;

static int tf_verbose=0;
int tf_mem_verbose=0;

void tf_log_verbose( int mode){
    tf_verbose=mode;
}

void tf_log_mem_verbose( int mode){
    tf_mem_verbose=mode;
}

/**
 * Init log system;
 */
    void tf_log_init( void ){
#if defined( TF_USE_SYS_LOG )
        openlog( "TagFolder", LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_DAEMON);
#else
        if( log_file_name==NULL){
            log_file_name = ( char*) malloc( strlen( TF_DEFAULT_LOG_FILE)+1);
            strcpy( log_file_name, TF_DEFAULT_LOG_FILE);
        }
        log_handle=fopen( log_file_name, "wt");
#endif
    }

/**
 * Destroy log system at exit;
 */
    void tf_log_destroy( void ){
#if defined( TF_USE_SYS_LOG )
        closelog();
#else
        if( log_handle!=NULL){
            fclose( log_handle);
        }
        if( log_file_name!=NULL ){
            free( log_file_name);
        }
#endif
    }


/**
 * Write log information to syslog, in printf style;
 * parameter: format=> format,
 *      valist=>...
 * return: void
 */
    void tf_log( const char* format, ...){
        if( format==NULL)
            return;

        static char buf[2048];

        va_list args;
        va_start( args, format);
        vsprintf( buf, format, args);
        va_end( args);
#if defined( TF_USE_SYS_LOG)
        syslog( LOG_INFO, buf);
#else
        if( log_handle!=NULL){
            fprintf( log_handle, "%s", buf);
        }
#endif
        if( tf_verbose!=0){
            fprintf( stdout, "%s", buf);
        }
    }

static int ind_cnt=0;
void tf_log_indent_to(){
    int i=0;
    for( i=0; i<ind_cnt; ++i){
        tf_log("   ");
    }
    ind_cnt++;
}

void tf_log_indent_from(){
    int i=0;
    ind_cnt--;
    for( i=0; i<ind_cnt;++i){
        tf_log("   ");
    }
}

#if defined( __cplusplus)
}   // extern "C"{
#endif
